package com.sisgesbyte.services.ventas;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;

import com.sisgesbyte.common.ConstModAdministracion;
import com.sisgesbyte.common.ConstProyeccion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.ventas.MantEmpleadoEstructuraDao;
import com.sisgesbyte.data.entity.ventas.EmpleadoEstructuraEntity;
import com.sisgesbyte.services.ventas.bean.FFVVBean;
import com.sisgesbyte.services.ventas.bean.ListaFFVVJerarquiaResponse;

@Stateless
public class MantenimientoFFVVServiceImpl implements MantenimientoFFVVService {

	@EJB
	private MantEmpleadoEstructuraDao mantEmpleadoEstructuraDao;
	@Inject
	private Validaciones validaciones;
	private List<EmpleadoEstructuraEntity> ffvvJerarquia;
	private List<EmpleadoEstructuraEntity> listaFfvv;
	
	@Override
	public ListaFFVVJerarquiaResponse listaJerarquiaFFVV(String codTransaccion,int idPadre) {
		
		String mensajeTransaccionMetodo = "[listaJerarquiaFFVV idTx=" + codTransaccion + "] - ";
		ListaFFVVJerarquiaResponse response = new ListaFFVVJerarquiaResponse();
	
	
		try{
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<Object> valores = new ArrayList<>();
			List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
			
			//filtro por ffvv activa
			FiltrosBean listaFFVV = new FiltrosBean();
			List<String> campoFFVV = new ArrayList<String>();
			campoFFVV.add("ee.active");
			listaFFVV.setCampos(campoFFVV);
			listaFFVV.setOperador("=");
			filtro.add(listaFFVV);
			valores.add(true);
			filtroSQL.setListaFiltros(filtro);
			filtroSQL.setListaValores(valores);
			
			listaFfvv= mantEmpleadoEstructuraDao.listaEmpleadosEstructura(filtroSQL);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al Obtener la lista de FFVV" +e.getMessage());
			response.setCodigoRespuesta(ConstModAdministracion.MANT_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
			return response;
		}
		
		if(listaFfvv.size() > 0){
			ffvvJerarquia = new ArrayList<EmpleadoEstructuraEntity>();
			
			for(EmpleadoEstructuraEntity lista : listaFfvv){
				if(lista.getId()==idPadre){
					ffvvJerarquia.add(lista);
				}
				if(idPadre==lista.getPadre_id()){
					obtenerHijos(lista.getId());
				}
			}
			
			System.out.println("Total de Hijos Obteneidos : " +ffvvJerarquia.size() );
			List<FFVVBean> listaHijos = new ArrayList<FFVVBean>(); 
			for(EmpleadoEstructuraEntity lista : ffvvJerarquia){
				FFVVBean bean = new FFVVBean();
				
				bean.setApellido(validaciones.validarCamposString(lista.getApellido()));
				bean.setCodigo(validaciones.validarCamposString(lista.getCodigo()));
				bean.setCodigoBanda(validaciones.validarCamposString(lista.getCodigo_banda()));
				bean.setEstructuraVenta(validaciones.validarCamposString(lista.getEstructura_venta()));
				bean.setId(lista.getId());
				bean.setIdCanal(lista.getCategoria_cliente_id());
				bean.setIdEmpleado(lista.getEmpleado_id());
				bean.setIdEstructuraVenta(lista.getEstructura_venta_id());
				bean.setIdPadre(lista.getPadre_id());
				bean.setIdZona(lista.getZona_id());
				bean.setNombre(validaciones.validarCamposString(lista.getNombre()));
				bean.setVentas(lista.getVentas());
				
				listaHijos.add(bean);
			}
			
			response.setListaJerarquiaFFVV(listaHijos);
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);	
			
		}else{
			System.out.println("No se encontro FFVV");
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDF);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDF);
		}
		
		return response;
	}
	public void obtenerHijos(int padreId) {
		for(EmpleadoEstructuraEntity ls : listaFfvv){
			//obtenemos los hijos
			if (padreId == ls.getPadre_id()) {
				ffvvJerarquia.add(ls);
				obtenerHijos(ls.getId());
			}
		}
	}
	@Override
	public ListaFFVVJerarquiaResponse listaFFVV(String codTransaccion,
			FiltrosSQLBean cadenaFiltros) {
		
		String mensajeTransaccionMetodo = "[listaFFVV idTx=" + codTransaccion + "] - ";
		ListaFFVVJerarquiaResponse response = new ListaFFVVJerarquiaResponse();
		
		List<EmpleadoEstructuraEntity> ffvv = null;
		try{
			ffvv = mantEmpleadoEstructuraDao.listaEmpleadosEstructura(cadenaFiltros);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo +"Error en BD al traer la lista de FFVV " +  e.getMessage());
			response.setCodigoRespuesta(ConstModAdministracion.MANT_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_LISTAR_MSJ_IDT.replace("msj", mensajeTransaccionMetodo));
			return response;
		}
		
		if(ffvv.size() > 0){
			List<FFVVBean> lista = new ArrayList<FFVVBean>();
			for(EmpleadoEstructuraEntity ls : ffvv){
				FFVVBean bean = new FFVVBean();
				bean.setApellido(validaciones.validarCamposString(ls.getApellido()));
				bean.setCodigo(validaciones.validarCamposString(ls.getCodigo()));
				bean.setCodigoBanda(validaciones.validarCamposString(ls.getCodigo_banda()));
				bean.setEstructuraVenta(validaciones.validarCamposString(ls.getEstructura_venta()));
				bean.setId(ls.getId());
				bean.setIdCanal(ls.getCategoria_cliente_id());
				bean.setIdEmpleado(ls.getEmpleado_id());
				bean.setIdEstructuraVenta(ls.getEstructura_venta_id());
				bean.setIdPadre(ls.getPadre_id());
				bean.setIdZona(ls.getZona_id());
				bean.setNombre(validaciones.validarCamposString(ls.getNombre()));
				bean.setVentas(ls.getVentas());
				
				lista.add(bean);
			}
			response.setListaJerarquiaFFVV(lista);
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
		}else{
			System.out.println(mensajeTransaccionMetodo + "No se encontro FFVV ");
			response.setCodigoRespuesta(ConstModAdministracion.MANT_LISTAR_COD_IDF);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_LISTAR_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
		}
		
		response.setIdTransaccion(codTransaccion);
		
		return response;
	}
}
